package 其他.字符串转换后的长度I3335;

public class Solution {
    private static final int MOD = 1000000007;

    /**
     * 计算字符串经过转换后的长度
     * 转换规则为：每个字符可以转换为另一个字符，转换的规则基于输入的字符串s和转换次数t
     * 此方法通过模拟转换过程来计算最终字符串的长度，而不是直接生成转换后的字符串
     * 这样做是为了处理大规模数据时提高效率和避免内存溢出
     *
     * @param s 输入的字符串，基于此字符串进行转换
     * @param t 转换次数，表示进行转换的轮数
     * @return 返回转换后字符串的长度
     */
    public int lengthAfterTransformations(String s, int t) {
        // 初始化一个数组来统计每个字母出现的次数
        long[] cnt = new long[26];
        // 遍历字符串s，统计每个字符出现的次数
        for (int i = 0; i < s.length(); i++) {
            cnt[s.charAt(i) - 'a']++;
        }

        // 根据转换次数t，进行t轮转换操作
        for (int i = 1; i <= t; i++) {
            // 初始化一个临时数组nxt，用于存储转换后的字符计数
            long[] nxt = new long[26];
            // 将当前计数向前移动一位，模拟字符转换的过程
            for (int j = 0; j < 25; j++) nxt[j + 1] = cnt[j];
            // 特殊处理'a'和'b'的转换，它们会从'z'转换而来
            nxt[0] = (nxt[0] + cnt[25]) % MOD;
            nxt[1] = (nxt[1] + cnt[25]) % MOD;
            // 将临时数组nxt的值赋给cnt，为下一轮转换做准备
            for (int j = 0; j < 26; j++) cnt[j] = nxt[j];
        }
        // 初始化答案变量ans，用于累加所有字符转换后的总数
        long ans = 0;
        // 遍历cnt数组，将所有字符转换后的数量累加到ans中
        for (int i = 0; i < 26; i++) {
            ans = (ans + cnt[i]) % MOD;
        }

        // 返回转换后字符串的长度，由于可能超过int范围，需要进行类型转换
        return (int) ans;
    }

}

